function require(modulePath) {
  // 1. 根据传递进来的模块路径，得到模块完整的绝对路径
  var moduleId = getModuleId(modulePath);

  // 2. 判断缓存
  if(cache[moduleId]) {
    return cache[moduleId];
  }
  
  // 3. 真正运行模块代码的辅助函数
  function _require(exports, require, module, __filename, __dirname) {
    // 目标模块的代码将在这里运行
    this.a = 1;
    exports.b = 2;
    exports = {
      c: 3
    }
    module.exports = {
      d: 4 
    }
    exports.e = 5;
    this.i = 6;
  }

  // 4. 准备运行辅助函数
  var module = {
    exports: {}
  };
  
  var exports = module.exports;
  // 得到模块的绝对路径
  var __filename = getModuleId(modulePath);
  // 得到模块所在目录的绝对路径
  var __dirname = getDirname(__filename);
  // 5. 运行模块代码
  _require.call(exports, _require, module, __filename, __dirname);

  // 6. 缓存
  cache[moduleId] = module.exports;
  // 7. 返回模块的module.exports
  return module.exports;

}